package com.cskaoyan.javase.oop1._17pop;

/**
 * 把大象放进冰箱里
 * 用面向对象思想实现:
 *      程序是由对象组成的,由对象和对象的交互实现功能.
 *
 * 面向对象思想以对象为程序的核心,本质上仍然是方法调用完成程序功能,所以面向对象思想实际上和面向过程并不冲突,应该说面向对象思想是在面向过程的基础上发展而来的.
 *
 * 总结面向对象思想编程的优缺点:
 * 优点:
 *      1.不同的对象功能不同，进而就可以将程序模块化设计、分割，而不再是之前那么一条流水线式编写程序。
 *
 *      2.面向对象思想模块化编程，代码之间的关联会小很多（低耦合）可以实现代码复用，程序可以更好的应对需求变更，程序的扩展性会更好，可维护性会更强。 （最主要、最关键的优点）
 *
 *      3.面向对象思想模块化编程，各个模块之间低耦合，意味着完全可以互相独立进行开发，不需要 完全 互相了解各自模块，更有利于程序员之间的分工协作，降低了开发的难度。
 *
 * 缺点:
 *      1.面向对象思想编写程序有把简单问题,复杂化的趋势.如果是一个简单的问题,用面向对象思想开发多此一举.
 *      2.为了对象之间实现相对独立而又能够交互，需要大量的方法去完成这些功能，这会导致程序的代码越来越臃肿。面向对象的程序代码往往都十分庞大。
 *
 * 所以面向对象思想，适合于开发大型的企业级应用（业务逻辑复杂，业务场景经常变更），如果只是一个简单的小需求，还不如直接面向过程完成。
 *
 * @since 16:30
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // 创建对象,模拟过程
        Fridge f = new Fridge();
        Elephant e = new Elephant(f);
        e.runToFridge();
        f.openDoor();
        e.runToFridge();
        f.closeDoor();
    }
}

// 冰箱类
class Fridge {
    // 属性
    // 门开关的状态,默认false，门是关着的
    boolean doorState = false;

    // 行为
    public void openDoor() {
        if (!doorState) {
            doorState = true;
            System.out.println("门打开了，大象可以进来了！");
        }
    }

    public void closeDoor() {
        if (doorState) {
            doorState = false;
            System.out.println("门关上了！");
        }
    }
}

// 大象类
class Elephant {
    // 为了实现对象交互,持有冰箱对象引用作为成员变量
    private Fridge elephantF;

    // 行为
    public void runToFridge() {
        if (elephantF.doorState){
            System.out.println("门开着,那我进来了,请你关门!");
            return;
        }
        System.out.println("门没开,我进不去,快开门!");
    }

    public Elephant(Fridge elephantF) {
        this.elephantF = elephantF;
    }
}